{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 使用全连接神经网络进行房价回归"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 准备数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "train=pd.read_csv('datas/house_data.csv')\n",
    "y=train['SalePrice']\n",
    "train1=train.drop(['Id','SalePrice'], axis=1)\n",
    "X=pd.get_dummies(train1).reset_index(drop=True)\n",
    "X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=123)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 模型评测"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import mean_squared_error\n",
    "def benchmark(model,testset,label):\n",
    "    pred=model.predict(testset)\n",
    "    if pred[pred<0].shape[0]>0:\n",
    "        print('Neg Value')\n",
    "    rmse=np.sqrt(mean_squared_error(label,pred))\n",
    "    lrmse=np.sqrt(mean_squared_error(np.log(label),np.log(pred)))\n",
    "\n",
    "    print('RMSE:',rmse)\n",
    "    print('LRMSE:',lrmse)\n",
    "    return lrmse"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 导入神经网络包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "import keras\n",
    "import tensorflow as tf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'2.2.4'"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "keras.__version__"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'1.11.0'"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tf.__version__"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [],
   "source": [
    "from keras.models import Sequential\n",
    "from keras.layers import Dense,Dropout\n",
    "from keras import metrics\n",
    "from keras import backend as K\n",
    "from keras.wrappers.scikit_learn import KerasRegressor"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 练习一\n",
    "\n",
    "请使用如下的简单神经网络进行机器学习通过动态调整来得到最好的结果\n",
    "\n",
    "1.网络隐藏层数1~6层\n",
    "\n",
    "2.每层的神经元个数10~100\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [],
   "source": [
    "def create_model():\n",
    "    model=Sequential()\n",
    "    model.add(Dense(10,input_dim=X_train.shape[1],activation='relu'))\n",
    "    model.add(Dense(300,activation='relu'))\n",
    "    model.add(Dropout(0.2))\n",
    "    model.add(Dense(50,activation='relu'))\n",
    "    model.add(Dense(1))\n",
    "    model.compile(optimizer='adam',loss='mean_squared_error')\n",
    "    return model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [],
   "source": [
    "model=create_model()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "dense_19 (Dense)             (None, 10)                3050      \n",
      "_________________________________________________________________\n",
      "dense_20 (Dense)             (None, 300)               3300      \n",
      "_________________________________________________________________\n",
      "dropout_3 (Dropout)          (None, 300)               0         \n",
      "_________________________________________________________________\n",
      "dense_21 (Dense)             (None, 50)                15050     \n",
      "_________________________________________________________________\n",
      "dense_22 (Dense)             (None, 1)                 51        \n",
      "=================================================================\n",
      "Total params: 21,451\n",
      "Trainable params: 21,451\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {},
   "outputs": [],
   "source": [
    "history=model.fit(X_train,y_train,epochs=2020,batch_size=32,verbose=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "RMSE: 27551.522255518415\n",
      "LRMSE: 0.12987449404963047\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.12987449404963047"
      ]
     },
     "execution_count": 120,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "benchmark1(model,X_test,y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x1a346a85f8>]"
      ]
     },
     "execution_count": 121,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(history.history['loss'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {},
   "outputs": [],
   "source": [
    "model=create_model()\n",
    "history=model.fit(X_train,y_train,validation_data=(X_test,y_test),epochs=3350,batch_size=32,verbose=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x1a34e5d8d0>]"
      ]
     },
     "execution_count": 125,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(history.history['loss'])\n",
    "plt.plot(history.history['val_loss'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "RMSE: 29834.59446836246\n",
      "LRMSE: 0.13039614991154375\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.13039614991154375"
      ]
     },
     "execution_count": 126,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "benchmark1(model,X_test,y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 215,
   "metadata": {},
   "outputs": [],
   "source": [
    "from keras.layers import BatchNormalization,Activation\n",
    "from keras import optimizers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "##"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 练习二\n",
    "\n",
    "使用BatchNormalization层\n",
    "\n",
    "使用SGD进行训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 253,
   "metadata": {},
   "outputs": [],
   "source": [
    "def create_model2():\n",
    "    model=Sequential()\n",
    "    model.add(Dense(10,input_dim=X_train.shape[1]))\n",
    "    model.add(BatchNormalization())\n",
    "    model.add(Activation('relu'))\n",
    "    model.add(Dense(300))\n",
    "    model.add(BatchNormalization())\n",
    "    model.add(Activation('relu'))\n",
    "    #model.add(Dropout(0.2))\n",
    "    model.add(Dense(50,activation='relu'))\n",
    "    model.add(Dense(1))\n",
    "    sgd = optimizers.SGD(lr=0.001, decay=1e-6, momentum=0.9, nesterov=True)\n",
    "    model.compile(optimizer=sgd,loss='mean_squared_error')\n",
    "    return model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 230,
   "metadata": {},
   "outputs": [],
   "source": [
    "model=create_model2()\n",
    "history=model.fit(X_train,y_train,validation_data=(X_test,y_test),epochs=1000,batch_size=32,verbose=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 231,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x1a3cfdc198>]"
      ]
     },
     "execution_count": 231,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(history.history['loss'])\n",
    "plt.plot(history.history['val_loss'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 228,
   "metadata": {},
   "outputs": [],
   "source": [
    "#benchmark1(model,X_test,y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 练习三\n",
    "\n",
    "数据使用log或者万为单位\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 248,
   "metadata": {},
   "outputs": [],
   "source": [
    "#y_train"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 249,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train_log=np.log(y_train)\n",
    "y_train_wan=y_train/10000"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 250,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_test_log=np.log(y_test)\n",
    "y_test_wan=y_test/10000"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 251,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import RobustScaler"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 258,
   "metadata": {},
   "outputs": [],
   "source": [
    "def create_model3():\n",
    "    model=Sequential()\n",
    "    model.add(Dense(10,input_dim=X_train.shape[1]))\n",
    "    model.add(BatchNormalization())\n",
    "    model.add(Activation('relu'))\n",
    "    model.add(Dense(300))\n",
    "    model.add(BatchNormalization())\n",
    "    model.add(Activation('relu'))\n",
    "    #model.add(Dropout(0.2))\n",
    "    model.add(Dense(50,activation='relu'))\n",
    "    model.add(Dense(1))\n",
    "    #sgd = optimizers.SGD(optimizer='adam',loss='mean_squared_error')\n",
    "    model.compile(optimizer='adam',loss='mean_squared_error')\n",
    "    return model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 259,
   "metadata": {},
   "outputs": [],
   "source": [
    "model=create_model3()\n",
    "history=model.fit(X_train,y_train_wan,validation_data=(X_test,y_test_wan),epochs=3000,batch_size=32,verbose=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 277,
   "metadata": {},
   "outputs": [],
   "source": [
    "plt.plot(history.history['loss'])\n",
    "plt.plot(history.history['val_loss'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 267,
   "metadata": {},
   "outputs": [],
   "source": [
    "benchmark1(model,X_test,y_test_wan)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 练习四\n",
    "\n",
    "使用RobustScale进行训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 263,
   "metadata": {},
   "outputs": [],
   "source": [
    "transformer=RobustScaler().fit(X_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 268,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train_norm=transformer.transform(X_train)\n",
    "X_test_norm=transformer.transform(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 269,
   "metadata": {},
   "outputs": [],
   "source": [
    "def create_model4():\n",
    "    model=Sequential()\n",
    "    model.add(Dense(10,input_dim=X_train.shape[1]))\n",
    "    #model.add(BatchNormalization())\n",
    "    model.add(Activation('relu'))\n",
    "    model.add(Dense(300))\n",
    "    #model.add(BatchNormalization())\n",
    "    model.add(Activation('relu'))\n",
    "    #model.add(Dropout(0.2))\n",
    "    model.add(Dense(50,activation='relu'))\n",
    "    model.add(Dense(1))\n",
    "    #sgd = optimizers.SGD(optimizer='adam',loss='mean_squared_error')\n",
    "    model.compile(optimizer='adam',loss='mean_squared_error')\n",
    "    return model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "model=create_model4()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 278,
   "metadata": {},
   "outputs": [],
   "source": [
    "history=model.fit(X_train_norm,y_train,validation_data=(X_test_norm,y_test),epochs=500,batch_size=32,verbose=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "plt.plot(history.history['loss'])\n",
    "plt.plot(history.history['val_loss'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "benchmark1(model,X_test_norm,y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 练习五\n",
    "\n",
    "请根据上述的实验综合设计你的模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 224,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'2.2.4'"
      ]
     },
     "execution_count": 224,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "keras.__version__"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 225,
   "metadata": {},
   "outputs": [],
   "source": [
    "import tensorflow as tf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 226,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'1.11.0'"
      ]
     },
     "execution_count": 226,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tf.__version__"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4rc1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
